package marketplace.componente.servicios;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import javax.persistence.TypedQuery;


import marketplace.componente.usuarios.AdminUsuarios;
import marketplace.entities.Alimentacion;
import marketplace.entities.Alojamiento;
import marketplace.entities.PaqueteServicios;
import marketplace.entities.Servicio;
import marketplace.entities.Tour;

import marketplace.objects.*;



//java:global/EnterpriseMarketplaceProject/ComponenteServicios/AdminServicios
/**
 * Session Bean implementation class AdminServicios
 */
@Stateless
public class AdminServicios implements AdminServiciosRemote{

	//ATRIBUTOS
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@PersistenceContext(unitName="MarketPlacePersistenceComponent")
	private EntityManager em;
	
	@EJB
	private AdminUsuarios adminUsuarios;
	
	
	//CONSTRUCTORES
    /**
     * Default constructor. 
     */
    public AdminServicios() 
    {
        // TODO Auto-generated constructor stub
    }

    
    //METODOS
	@Override
	public void registrarServicio(ServicioBO nServicio, String tipo) 
	{
		// TODO Auto-generated method stub
		if(tipo.equals(ServicioBO.ALOJAMIENTO))
		{
			Alojamiento temp = new Alojamiento((AlojamientoBO)nServicio);
			em.persist(temp);
		}
		else if (tipo.equals(ServicioBO.ALIMENTACION)) 
		{
			Alimentacion temp = new Alimentacion((AlimentacionBO)nServicio);
			em.persist(temp);
		}
		else
		{
			Tour temp = new Tour((TourBO)nServicio);
			em.persist(temp);
		}
		
	}

	@Override
	public ServicioBO consultarServicio(long id) 
	{
		// TODO Auto-generated method stub
		
		Servicio temp = (Servicio)em.find(Servicio.class, id);
		
		if(temp.getTipo().equals(ServicioBO.ALIMENTACION))
		{
			return new AlimentacionBO((Alimentacion)temp);
		}
		else if (temp.getTipo().equals(ServicioBO.ALOJAMIENTO))
		{
			return new AlojamientoBO((Alojamiento)temp);
		}
		else
		{
			return new TourBO((Tour)temp);
		}
		
	}

	@Override
	public void eliminarServicio(long id) 
	{
		// TODO Auto-generated method stub
		Servicio temp = (Servicio)em.find(Servicio.class, id);

		em.remove(temp);
		
	}

	@Override
	public void editarServicio(ServicioBO nServicio, String tipo) 
	{
		// TODO Auto-generated method stub
		if(tipo.equals(ServicioBO.ALIMENTACION))
		{
			Alimentacion temp = new Alimentacion((AlimentacionBO)nServicio);
			
			em.merge(temp);
		}
		else if(tipo.equals(ServicioBO.ALOJAMIENTO))
		{
			Alojamiento	temp = new Alojamiento((AlojamientoBO)nServicio);
			
			em.merge(temp);
		}
		else
		{
			Tour temp = new Tour((TourBO)nServicio);
			
			em.merge(temp);
		}
	}

	@Override
	public ArrayList<ServicioBO> consultarServiciosPorProveedor(String loginProveedor) 
	{
		// TODO Auto-generated method stub
		ProveedorBO prov = adminUsuarios.consultarProveedor(loginProveedor);
		
		return prov.getServicios();
	}

	@Override
	public ArrayList<ServicioBO> consultarServiciosPorTipo(String tipo) 
	{
		// TODO Auto-generated method stub
		TypedQuery<Servicio> query = em.createQuery("SELECT e FROM :tipo e",Servicio.class);
		query.setParameter("tipo",tipo);
		
		ArrayList<Servicio> s = (ArrayList<Servicio>) query.getResultList();
		ArrayList<ServicioBO> serv = new ArrayList<ServicioBO>();
		
		
		
		for(Servicio servicio:s)
		{
			
			
			ServicioBO ser;
			if(tipo.equals(ServicioBO.ALIMENTACION))
			{
				ser = new AlimentacionBO((Alimentacion)servicio);
			}
			else if(tipo.equals(ServicioBO.ALOJAMIENTO))
			{
				ser = new AlojamientoBO((Alojamiento)servicio);
			}
			else 
			{
				ser = new TourBO((Tour)servicio);
			}
			
			
			serv.add(ser);
		}
		
		return serv;
	}

	@Override
	public ArrayList<ServicioBO> consultarServiciosPorTipoYParametro(String tipo, String parametro, String valorParametro) 
	{
		// TODO Auto-generated method stub
		TypedQuery<Servicio> query= em.createQuery("SELECT p FROM :tipo p WHERE p.:param= :valorParametro",Servicio.class);
		query.setParameter("tipo",tipo);
		query.setParameter("param",parametro);
		query.setParameter("valorParametro",valorParametro);
		
		ArrayList<Servicio> s = (ArrayList<Servicio>) query.getResultList();
		ArrayList<ServicioBO> serv = new ArrayList<ServicioBO>();
		
		
		
		for(Servicio servicio:s)
		{
			
			
			ServicioBO ser;
			if(tipo.equals(ServicioBO.ALIMENTACION))
			{
				ser = new AlimentacionBO((Alimentacion)servicio);
			}
			else if(tipo.equals(ServicioBO.ALOJAMIENTO))
			{
				ser = new AlojamientoBO((Alojamiento)servicio);
			}
			else 
			{
				ser = new TourBO((Tour)servicio);
			}
			
			
			serv.add(ser);
		}
		
		return serv;
	}

	@Override
	public ArrayList<ServicioBO> consultarServicioPorParametro(String parametro, String valorParametro) 
	{
		// TODO Auto-generated method stub
		
		TypedQuery<Servicio> query= em.createQuery("SELECT p FROM Servicio p WHERE p.:param= :valorParametro",Servicio.class);
		query.setParameter("param",parametro);
		query.setParameter("valorParametro",valorParametro);
		
		ArrayList<Servicio> s = (ArrayList<Servicio>) query.getResultList();
		ArrayList<ServicioBO> serv = new ArrayList<ServicioBO>();
		
		
		
		for(Servicio servicio:s)
		{
			
			String tipo = servicio.getTipo();
			
			ServicioBO ser;
			if(tipo.equals(ServicioBO.ALIMENTACION))
			{
				ser = new AlimentacionBO((Alimentacion)servicio);
			}
			else if(tipo.equals(ServicioBO.ALOJAMIENTO))
			{
				ser = new AlojamientoBO((Alojamiento)servicio);
			}
			else 
			{
				ser = new TourBO((Tour)servicio);
			}
			
			
			serv.add(ser);
		}
		
		return serv;
		
	}

	@Override
	public void registrarPaqueteServicios(PaqueteServiciosBO nPaquete) 
	{
		// TODO Auto-generated method stub
		PaqueteServicios temp = new PaqueteServicios((PaqueteServiciosBO)nPaquete);
		
		em.persist(temp);
	}

	@Override
	public PaqueteServiciosBO consultarPaqueteServicios(long id) 
	{
		// TODO Auto-generated method stub
		PaqueteServicios temp = (PaqueteServicios)em.find(PaqueteServicios.class, id);
		
		PaqueteServiciosBO bo = new PaqueteServiciosBO(temp);
		
		return bo;
	}

	@Override
	public void editarPaqueteServicios(PaqueteServiciosBO nPaquete) 
	{
		// TODO Auto-generated method stub
		
		PaqueteServicios temp = new PaqueteServicios((PaqueteServiciosBO)nPaquete);
		
		em.merge(temp);
	}

	@Override
	public ArrayList<PaqueteServiciosBO> consultarPaqueteServiciosPorProveedor(String loginProvedor) 
	{
		// TODO Auto-generated method stub
		ProveedorBO prov = adminUsuarios.consultarProveedor(loginProvedor);
		
		return prov.getPaqueteServicios();
	}

	@Override
	public ArrayList<PaqueteServiciosBO> consultarPaqueteServiciosPorParametro(String param, String valorParametro) 
	{
		// TODO Auto-generated method stub
		TypedQuery<PaqueteServicios> query= em.createQuery("SELECT p FROM PaqueteServicios p WHERE p.:param= :valorParametro",PaqueteServicios.class);
		query.setParameter("param",param);
		query.setParameter("valorParametro",valorParametro);
		
		List<PaqueteServicios> lista= query.getResultList();
		
		ArrayList<PaqueteServiciosBO> coll = new ArrayList<PaqueteServiciosBO>();
		
		
		for(PaqueteServicios p:lista){
			
			
			PaqueteServiciosBO temp = new PaqueteServiciosBO(p);
			coll.add(temp);
		}
		
		return coll;
		
	}

}
